package com.hospital.common.utils;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * LocalDateTime 工具类
 * @author yhn
 * @version 1.0
 */
public class LocalDateTimeUtils {
    // 默认时区（可根据实际情况修改）
    private static final ZoneId DEFAULT_ZONE = ZoneId.of("Asia/Shanghai");

    // 常用格式化器
    public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * LocalDateTime 转 epoch 毫秒时间戳
     */
    public static long toEpochMillis(LocalDateTime dateTime) {
        return dateTime.atZone(DEFAULT_ZONE).toInstant().toEpochMilli();
    }

    /**
     * epoch 毫秒时间戳 转 LocalDateTime
     */
    public static LocalDateTime fromEpochMillis(long millis) {
        return Instant.ofEpochMilli(millis).atZone(DEFAULT_ZONE).toLocalDateTime();
    }

    /**
     * LocalDateTime 转格式化字符串
     */
    public static String format(LocalDateTime dateTime) {
        return dateTime.format(FORMATTER);
    }

    /**
     * 格式化字符串 转 LocalDateTime
     */
    public static LocalDateTime parse(String dateTimeStr) {
        return LocalDateTime.parse(dateTimeStr, FORMATTER);
    }

    /**
     * 获取当前时间戳（毫秒）
     */
    public static long nowEpochMillis() {
        return toEpochMillis(LocalDateTime.now());
    }

    /**
     * 获取当前时间（格式化）
     */
    public static String nowFormatted() {
        return format(LocalDateTime.now());
    }

    /**
     * 获取当前时间
     */
    public static LocalDateTime now() {
        return LocalDateTime.now();
    }

    /**
     * 获取过去 N 天的开始时间
     */
    public static LocalDateTime startDaysAgo(int days) {
        return now().minusDays(days);
    }

    /**
     * 获取过去 N 周的开始时间
     */
    public static LocalDateTime startWeeksAgo(int weeks) {
        return now().minusWeeks(weeks);
    }

    /**
     * 获取过去 N 月的开始时间
     */
    public static LocalDateTime startMonthsAgo(int months) {
        return now().minusMonths(months);
    }

    /**
     * 获取过去任意时间单位的开始时间
     */
    public static LocalDateTime startAgo(int amount, ChronoUnit unit) {
        return now().minus(amount, unit);
    }

    /**
     * 获取过去 N 天的时间区间（返回数组）
     */
    public static LocalDateTime[] rangeDaysAgo(int days) {
        return new LocalDateTime[] { startDaysAgo(days), now() };
    }

    /**
     * 获取过去 N 周的时间区间
     */
    public static LocalDateTime[] rangeWeeksAgo(int weeks) {
        return new LocalDateTime[] { startWeeksAgo(weeks), now() };
    }

    /**
     * 获取过去 N 月的时间区间
     */
    public static LocalDateTime[] rangeMonthsAgo(int months) {
        return new LocalDateTime[] { startMonthsAgo(months), now() };
    }

    /**
     * 获取过去任意时间单位的时间区间
     */
    public static LocalDateTime[] rangeAgo(int amount, ChronoUnit unit) {
        return new LocalDateTime[] { startAgo(amount, unit), now() };
    }
}
